Dart SDK
我在工作中接触到 Dart 语言的底层实现,Dart 是一门非常强大的语言,这引起了我的兴趣,想将它研究清楚。
一段 Dart 源码字符串,是如何被一步步编译成字节码,并由 Runtime 执行的呢?在本文中,我将进行探索,来回答这个问题。
我们的旅程从 Dart SDK 的 Dart _fe_analyzer_shared 包开始。
《Maeiee's Dart Adventures》
This blog series explores the Dart SDK internals, guiding readers through its compiler framework and more.
This series, seen through Maeiee's eyes, provides practical tips and insights for both new and experienced developers. Join us to unlock Dart's potential and enhance your coding skills!
Series Link:Maeiee's Dart Adventures: Exploring the World of Dart SDK.
Subject
- Dart SDK Directory Layout
- Dart SDK frontend_server
- scanner
- Dart Isolate
- Dart VM-isolate
- Dart kernel-service
- Dart build_integration
- Dart SDK Summary
- Dart Macro
- Dart SDK Component
- Dart SDK Library
- Dart SDK Expression
- Dart SDK Compiler test modular_loader_test.dart
- Dart SDK Target
- Dart SDK TargetImplementation
- Dart SDK libraries.json
- 3 types of options:
- 3 types of dills:
- Dart SDK CompilerContext
- Dart SDK SourceLoader
- Dart SDK SourceLibraryBuilder
- Fasta
- Dart _fe_analyzer_shared
- Dart _fe_analyzer_shared parser StackListener
- Dart _fe_analyzer_shared parser DirectiveContext
- Dart _fe_analyzer_shared parser Listener
- Dart _fe_analyzer_shared parser Parser
- Dart _fe_analyzer_shared scanner
- Dart _fe_analyzer_shared scanner AbstractScanner tokenize
- Dart _fe_analyzer_shared scanner parser
- Dart _fe_analyzer_shared SyntacticEntity
Black Magic:
七、编译器 or 静态分析器?
拿到抽象语法树之后,接着干啥呢?有两个可做之事:
- 编译器:继续编译流程,将语法树一步步编译成内核二进制格式(Kernel binary format),这是 Dart VM 和 Dart 编译器(如 dart2js)可以理解的中间表示(Intermediate Representation, IR)。
- 静态分析器:对代码进行静态分析,日常开发中的 IDE/编辑器的代码提示,以及 Lint,底层都是基于静态分析器。在 Dart SDK 中,这一部分由 Dart Analyzer 负责。
在本文中,我选择编译器这一支,先继续分析编译器。等后面有时间了,再补上静态分析器的分支。
IncrementalCompiler
IncrementalCompiler
是 Dart SDK 中的一个类,专门用于实现 Dart 程序的增量编译。增量编译是一种编程技术,它能够仅重新编译自上次编译以来发生变化的部分代码,而不是重新编译整个程序。这样可以显著提高编译速度,特别是在开发过程中对于频繁修改的大型代码库来说尤其有用。
在 Dart SDK 的上下文中,IncrementalCompiler
类的作用是:
-
跟踪代码的更改:IncrementalCompiler 能够跟踪源代码文件的更改,以确定自上一次编译以来哪些文件被修改过。
-
重新编译更改的代码:IncrementalCompiler 会重新编译所有更改过的源代码文件,以及由于这些更改可能受到影响的其他代码。
-
生成更新的程序:它将这些重新编译的代码片段合并到已有的程序结构中,生成更新后的程序。
-
性能优化:通过这种方式,IncrementalCompiler 可以避免每次都从头开始编译整个程序,节约时间,提高开发效率。
这种编译方式在开发过程中特别重要,因为它允许开发者快速测试他们的更改,无需等待整个应用重新编译。这对于 Dart 平台上的 Flutter 应用开发尤为关键,因为它支持热重载(hot reload),即在应用运行时动态更新界面和逻辑,大幅提高开发效率。
敬请期待……
AbstractParserAstListener
ParserASTListener
getAST
generateKernelInternal
BenchmarkPhases 枚举,标记了 Build 的各个流程。
-
kernelForProgram
- generateKernelInternal
- DillTarget
- buildOutlines
- KernelTarget
- computeNeededPrecompilations
- precompileMacros
- _buildInternal
- InternalCompilerResult
- DillTarget
- generateKernelInternal
-
TreeNode
- Pattern
- MapPatternEntry
- Component
- ……
runWithFrontEndCompilerContext
Web Resources
本文作者:Maeiee
本文链接:Dart SDK
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!